📝
React (2)
December 26, 2023
MinutesToHours 컴포넌트 함수
const root = document.querySelector("#root");
function MinutesToHours() {
const [amount, setAmount] = React.useState(0);
const [flipped, setFliped] = React.useState(false);배열 비구조화 할당
- amount는 React.useState(0)을 사용해 초기값을 0으로 설정,
flipped는 React.useState(false) 초기값을 false로 설정 하게된다. - setAmount, setFliped 함수는 amount와 flipped의 값을 업데이트 할때 사용된다.
const onChange = () => {
setAmount(event.target.value);
};
const reset = () => setAmount(0);
const onFlip = () => {
reset();
setFliped((current) => !current);
};-
setFliped(counter + 1)로 로직을 만들 경우 counter는 state를 할당한 값만 참조한다.
즉, setFliped를 여러번 호출하게 되면 값이 항상 2가 된다. -
하지만 setFliped((current) => !current)로 로직을 만들 경우 current에는 useStete의 state자체를 참조한다.
여러번 함수를 호출하게 되면 값을 업데이트해서 반영한다.
return (
<div>
<div>
<label htmlFor="minutes">Minutes</label>
<input
value={flipped ? amount * 60 : amount}
/*
삼항 연산자를 사용해서 flipped가 true일때는 amount * 60의 값을 반영,
false일때는 amount 의 값을 반영한다.
*/
id="minutes"
placeholder="Minutes"
type="number"
onChange={onChange}
disabled={flipped}
/>
</div>
<div>
<label htmlFor="hours">Hours</label>
<input
value = {flipped ? amount : Math.round(amount / 60)}
id="hours"
placeholder="Hours"
type="number"
onChange={onChange}
disabled={!flipped}
/>
</div>
<button onClick={reset}>Reset</button>
<button onClick={onFlip}>Flip</button>
</div>
);
}React에서는 Jsx문법을 Javascript로 변환하기 때문에 따로 Javascript를 쓰기 위해서는 {}를 사용해 주어야 한다.
App 컴포넌트 함수
function App() {
const [index, setIndex] = React.useState("xx");
const onSelect = (event) => {
setIndex(event.target.value);
};
//setIndex 함수를 이용해서 해당 옵션의 value 값을 index의 값으로 업데이트 한다.
return (
<div>
<h1>Super Converter</h1>
<select onChange={onSelect}>
<option value="xx">Select your units</option>
<option value="0">Minutes & Hours</option>
<option value="1">Km & miles</option>
</select>
{/*옵션을 선택할때마다 변화를 감지해서 onSlelct 함수가 동작하게 된다.*/}
<hr />
{index === "xx" ? <h3>"Please select your units"</h3> : null}
{index === "0" ? <MinutesToHours /> : null}
{index === "1" ? <KmToMiles /> : null}
{/*index의 비교되는 값과 같을때 ? 뒤에 있는 텍스트나 컴포넌트를 렌더링한다.*/}
</div>
);
}